home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
falcon
/
utils
/
magi.lzh
/
MAGI.S
< prev
next >
Wrap
Text File
|
1993-05-10
|
10KB
|
496 lines
; MAGI, Par AGOPIAN Mathias
; pour STMAG.
; Le Falcon est une merveille...
; La preuve :
;english comments & translation by Gunstick
superviseur MACRO
clr.l -(sp)
move.w #$20,-(sp)
trap #1
addq.l #6,sp
move.l d0,oldsp
ENDM
utilisateur MACRO
move.l oldsp,-(sp)
move.w #$20,-(sp)
trap #1
addq.l #6,sp
ENDM
lea finconfig,a2
lea config,a0
lea $300000,a1
bcl move.b (a0)+,(a1)+
cmp.l a0,a2
bhi bcl
superviseur
move.l $4f2,a0
jmp (a0)
utilisateur
oldsp dc.l 0
config dc.l 'MAGI'
dc.l 0
dc.l 0
lea text1(pc),a0
bsr print
; On met l'arbre de la PMMU hors de danger.
;save MMU tree
lea my_pmmu(pc),a0
lea $310700,a1
move.l a1,d7
move.w #$100-1,d0
.copy move.b (a0)+,(a1)+
dbf d0,.copy
lea pmmureg(pc),a0
pmove.d crp,(a0)
move.l d7,4(a0)
pmove.d (a0),crp
; Puis on initialise correctement la matrice DMA
; le HP interne ON (beuark)
sound move.w #%10111111,-(sp)
move.w #$1d,-(sp)
trap #14
addq.l #4,sp
;ADDER
move.w #3,-(sp) ; Matrice + ADC
move.w #4,-(sp)
move.w #130,-(sp)
trap #14
addq.l #6,sp
; ADC INPUT
move.w #3,-(sp) ; PSG input
move.w #5,-(sp)
move.w #130,-(sp)
trap #14
addq.l #6,sp
; Set prescale
move.w #3,-(sp) ; 50Khz
move.w #6,-(sp)
move.w #130,-(sp)
trap #14
addq.l #6,sp
; Devconnect
move.w #1,-(sp) ; DMA -> DAC
move.w #0,-(sp)
move.w #0,-(sp)
move.w #8,-(sp)
move.w #0,-(sp)
move.w #139,-(sp)
trap #14
lea 12(sp),sp
; Setinterrupt
move.w #1,-(sp) ; Play
move.w #0,-(sp) ; Timer A
move.w #135,-(sp)
trap #14
addq.l #6,sp
; Ici, c'est les initialisations
move.w #$3111,d7 ; Active le cache !
lea q1(pc),a0
bsr print
bsr inkey
cmp.b #'y',d0
beq.s .q1o
or.w #$0008,d7 ; Désactive le cache d'instruction
.q1o lea q2(pc),a0
bsr print
bsr inkey
cmp.b #'y',d0
beq.s .q2o
or.w #$0800,d7 ; Désactive le cache de donnée
.q2o movec d7,CACR
; 16 Mhz, normal quoi
or.b #$65,$ffff8007.w
lea q3(pc),a0
bsr print
bsr inkey
cmp.b #'y',d0
beq.s .q3o
bclr.b #0,$ffff8007.w ; 68030 à 8 Mhz
.q3o lea q4(pc),a0
bsr print
bsr inkey
cmp.b #'y',d0
beq.s .q4o
bclr.b #2,$ffff8007.w ; Blitter à 8 Mhz
.q4o lea q5(pc),a0
bsr print
bsr inkey
cmp.b #'y',d0
bne.s .q5o
; Emulation STE:
; Regardez bien le bit 5, c'est une
; merveille, grace à lui, on va
; faire des miracles...
;this disables a lot of BUS errors
bclr.b #5,$ffff8007.w ; Mode STE
.q5o lea q6(pc),a0
bsr print
bsr inkey
cmp.b #'n',d0
beq .q6o
; VECTEURS
lea $0,a0
lea my_vectors(pc),a1
move.w #1024-1,d0
.copy move.b (a0)+,(a1)+
dbf d0,.copy
lea my_vectors(pc),a1
lea buserr(pc),a0
move.l a0,$8(a1)
lea adderr(pc),a0
move.l a0,$c(a1)
lea illegal(pc),a0
move.l a0,$10(a1)
lea div0(pc),a0
move.l a0,$14(a1)
lea chk(pc),a0
move.l a0,$18(a1)
lea trapv(pc),a0
move.l a0,$1c(a1)
lea trace(pc),a0
move.l a0,$24(a1)
lea my_la(pc),a0
move.l a0,$28(a1)
lea my_lf(pc),a0
move.l a0,$2c(a1)
lea my_vbl(pc),a0
move.l a0,$70(a1)
lea my_hbl(pc),a0
move.l a0,$68(a1)
lea my_mfp(pc),a0
move.l a0,$78(a1)
lea my_ta(pc),a0
move.l a0,$134(a1)
lea my_tb(pc),a0
move.l a0,$120(a1)
lea my_tc(pc),a0
move.l a0,$114(a1)
lea my_td(pc),a0
move.l a0,$110(a1)
lea my_mn(pc),a0
move.l a0,$13c(a1)
lea my_blt(pc),a0
move.l a0,$10c(a1)
lea my_dma(pc),a0
move.l a0,$11c(a1)
lea my_ikbd(pc),a0
move.l a0,$118(a1)
lea $80(a1),a1
lea my_tr0(pc),a0
move.l a0,(a1)+
lea my_tr1(pc),a0
move.l a0,(a1)+
lea my_tr2(pc),a0
move.l a0,(a1)+
lea my_tr3(pc),a0
move.l a0,(a1)+
lea my_tr4(pc),a0
move.l a0,(a1)+
lea my_tr5(pc),a0
move.l a0,(a1)+
lea my_tr6(pc),a0
move.l a0,(a1)+
lea my_tr7(pc),a0
move.l a0,(a1)+
lea my_tr8(pc),a0
move.l a0,(a1)+
lea my_tr9(pc),a0
move.l a0,(a1)+
lea my_tra(pc),a0
move.l a0,(a1)+
lea my_trb(pc),a0
move.l a0,(a1)+
lea my_trc(pc),a0
move.l a0,(a1)+
lea my_trd(pc),a0
move.l a0,(a1)+
lea my_tre(pc),a0
move.l a0,(a1)+
lea my_trf(pc),a0
move.l a0,(a1)
lea my_vectors(pc),a1
movec a1,VBR
lea basevec(pc),a0
move.l a1,(a0)
.q6o ; Set TIMER A or MFPi7
lea q7(pc),a0
bsr print
bsr inkey
cmp.b #'y',d0
beq.s .q7o
; Setinterrupt
move.w #1,-(sp) ; Play
move.w #1,-(sp) ; MFPi7
move.w #135,-(sp)
trap #14
addq.l #6,sp
.q7o lea q8(pc),a0
bsr print
bsr inkey
cmp.b #'n',d0
beq.s .q8o
move.w #%01000000,-(sp) ; Coupe le HP interne
move.w #$1e,-(sp)
trap #14
addq.l #4,sp
.q8o ; On reboot
lea text2(pc),a0
bsr print
bsr inkey
move.l $4c6.w,a0
eor.w #$FFFF,(a0) ;detruit la checksum
move.w #1,-(sp)
move.w #0,-(sp)
move.w #0,-(sp)
move.w #1,-(sp)
move.w #0,-(sp)
clr.l -(sp)
move.l $4c6,-(sp)
move.w #8,-(sp)
trap #14
lea 20(sp),sp
; somme de controle
clr.l d0
move.l $4c6.w,a0
move.w #255,d7
check add.w (a0)+,d0
dbf d7,check
cmp.w #$1234,d0
bne.s .fin
move.l $4c6,a0
jsr (a0)
.fin lea text3(pc),a0
bsr print
bsr inkey
rts ;-> Bureau GEM
; Routines Annexes
print move.l a0,-(sp)
move.w #9,-(sp)
trap #1
addq.l #6,sp
rts
inkey move.w #1,-(sp)
trap #1
addq.l #2,sp
rts
; Ca, c'est la ruse, on piège le FALCON !
; Remarquez, vous pouvez metre ce que
; vous voulez ici (héhé)
;here is the new exception table.
;insert your own routines if you wish
illegal jmp ([$10])
div0 jmp ([$14])
chk jmp ([$18])
trapv jmp ([$1c])
trace jmp ([$24])
my_hbl jmp ([$68])
my_vbl jmp ([$70])
my_mfp jmp ([$78])
my_ta jmp ([$134])
my_tb jmp ([$120])
my_tc jmp ([$114])
my_td jmp ([$110])
my_mn jmp ([$13c])
my_dma jmp ([$11c])
my_ikbd jmp ([$118])
my_blt jmp ([$10c])
my_la jmp ([$28])
my_lf jmp ([$2c])
my_tr0 jmp ([$80])
my_tr1 jmp ([$84])
my_tr2 jmp ([$88])
my_tr3 jmp ([$8c])
my_tr4 jmp ([$90])
my_tr5 jmp ([$94])
my_tr6 jmp ([$98])
my_tr7 jmp ([$9c])
my_tr8 jmp ([$a0])
my_tr9 jmp ([$a4])
my_tra jmp ([$a8])
my_trb jmp ([$ac])
my_trc jmp ([$b0])
my_trd jmp ([$b4])
my_tre jmp ([$b8])
my_trf jmp ([$bc])
; Correction des erreurs bus et adresses
;only for experts... fucking around in the stackframe of
;bus error to enable a somewhat correct sound on bad adresses
buserr
adderr move.w #$2700,sr
move.l d0,$300004
move.l a0,$300008
moveq #0,d0
move.w $a(sp),d0
btst.l #8,d0 ; DF=1 ?
beq BorC ; non
; Erreur sur un cycle de donnée
btst.l #6,d0 ; oui, RW=1 ?
beq.s ecr ; non, -> ecr
lec bclr.l #8,d0 ; DF=0
move.w d0,$a(sp)
cmp.w #$ff88,$11(sp) ; Erreur sur les reg. PSG?
bne.s noPSGr ; non
move.b $ffff8800.w,d0
move.b d0,$2c(sp) ; et oui
move.b d0,$2d(sp) ; Réfléchissez un peu
move.b d0,$2e(sp)
move.b d0,$2f(sp)
bra finexec
noPSGr clr.l $2c(sp) ; Temps pis, on renvoie zero !
move.w #$00f,$ffff8240.w ; Rouge
bra finexec
ecr bclr.l #8,d0 ;DF=0
move.w d0,$a(sp)
cmp.w #$ff88,$11(sp)
bne notPSGw
and.w #$ff02,$12(sp) ; correction de l'adresse
tst.b $13(sp)
bne.s ff8802
ff8800 and.w #$30,d0
lsr.w #4,d0
tst.w d0
beq.s .s2
cmp.w #1,d0
beq.s .s1
cmp.w #2,d0
beq.s .s3
.s1 move.b $1b(sp),$ffff8800.w ; Octet
bra finexec
.s2 move.b $1a(sp),$ffff8800.w ; Mot
bra finexec
.s3 move.b $18(sp),$ffff8800.w
move.b $1a(sp),$ffff8802.w ; Long mot
bra finexec
;is there a volunteer to check also the movem instruction???
ff8802 and.w #$30,d0
lsr.w #4,d0
tst.w d0
beq.s .s2
cmp.w #1,d0
beq.s .s1
cmp.w #2,d0
beq.s .s3
.s1 move.b $1b(sp),$ffff8802.w
bra finexec
.s2 move.b $1a(sp),$ffff8802.w
bra finexec
.s3 move.b $18(sp),$ffff8802.w
move.b $1a(sp),$ffff8800.w
bra finexec
notPSGw move.w #$0f0,$ffff8240.w
bra finexec ; bah, on fait rien, y'a rien a faire !
BorC btst.l #14,d0
beq.s etageB
btst.l #15,d0
beq.s etageC
bra finexec ; Ceci ne doit JAMAIS arriver
etageB move.w #$f00,$ffff8240.w
bclr.l #12,d0 ; RB=0
move.w d0,$a(sp)
cmp.w #$a,6(sp) ; format $A ?
bne.s .fB
.fA move.w 2(sp),a0 ; simulons, simulons
move.w a0,$e(sp) ; bof, bof!
bra fin